home *** CD-ROM | disk | FTP | other *** search
- /* Digger functions.
- 08/07/90, Bob Applegate wa2zzx */
-
- #include <stdio.h>
- #include <ctype.h>
- #include <exec/types.h>
- #include <time.h>
- #include "global.h"
- #include "cmdparse.h"
- #include "commands.h"
- #include "proc.h"
- #include "files.h"
- #include "smtp.h"
- #include <dos.h>
- #include <ios1.h>
- #include <proto/dos.h>
- #include "bm.h"
- #include "ax25.h"
-
- static int mailcat __ARGS((char *file,char *explanation));
- static int AddSMTPHeader __ARGS((FILE *tfile, char *explanation));
-
- extern char *mbxtime __ARGS((char *line));
- extern char *Organ, *RHdr;
-
- int DiggerLock, MaxSeg = 3000, MaxReq = 5, reqcnt = 0;
- extern char *Digger, *DiggerC;
- char whoto[80], *tonic;
-
- static void DiggerProcess __ARGS(());
- static int CheckForStuff __ARGS((int argc,char *argv[],void *p));
- static struct proc *ProcessPointer;
-
- extern int mlock __ARGS((char *dir,char *id));
- extern int rmlock __ARGS((char *dir,char *id));
-
- static int dgstart __ARGS((int argc,char *argv[],void *p));
- static int dgstop __ARGS((int argc,char *argv[],void *p));
- static int dgkick __ARGS((int argc,char *argv[],void *p));
- static int dgsegsiz __ARGS((int argc,char *argv[],void *p));
- static int dgmaxreq __ARGS((int argc,char *argv[],void *p));
-
- static int dgban __ARGS((int argc,char *argv[],void *p));
- static int dgunban __ARGS((int argc,char *argv[],void *p));
-
- /* Digger: Banned Users */
- struct br {
- struct br *prev;
- struct br *next;
- char addr[AXALEN];
- int bancnt;
- };
-
- struct br *Br;
-
- static struct cmds Diggercmds[] = {
- "ban", dgban, 0, 0, NULLCHAR,
- "kick", dgkick, 0, 0, NULLCHAR,
- "maxrequests", dgmaxreq, 0, 0, NULLCHAR,
- "on", dgstart, 0, 0, NULLCHAR,
- "off", dgstop, 0, 0, NULLCHAR,
- "segmentsize", dgsegsiz, 0, 0, NULLCHAR,
- "unban", dgunban, 0, 0, NULLCHAR,
- NULLCHAR
- };
-
- int dodigger(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- return subcmd(Diggercmds,argc,argv,p);
- }
-
- static int dgstart(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- ProcessPointer = newproc("Digger",1024,DiggerProcess,0,NULL,NULL);
-
- return 0;
- }
-
- static int dgstop(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- killproc(ProcessPointer);
-
- return 0;
- }
-
- static int dgkick(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- psignal(&DiggerLock,1);
-
- return 0;
- }
-
- static int dgsegsiz(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- if(argc > 1)
- MaxSeg = atoi(argv[1]);
- else
- tprintf("Maximum Message Segment: %d Bytes\n",MaxSeg);
-
- return 0;
- }
-
- static int dgmaxreq(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- if(argc > 1)
- MaxReq = atoi(argv[1]);
- else
- tprintf("Requests per Message: %d\n",MaxReq);
-
- return 0;
- }
-
- static int dgban(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- register struct br *bp;
-
- if (argc < 2) {
- tprintf("Banned users: ");
- if(Br != NULLLQ)
- for(bp = Br;bp != NULLLQ;bp = bp->next)
- tprintf(" %s(%d)",bp->addr,bp->bancnt);
- else
- tprintf(" Empty");
- tprintf("\n");
- } else {
- bp = (struct br *)callocw(1,sizeof(struct br));
- memcpy(bp->addr,argv[1],AXALEN);
- bp->bancnt = atoi(argv[2]) == 0 ? 1 : atoi(argv[2]);
- bp->next = Br;
- if(bp->next != NULLLQ)
- bp->next->prev = bp;
- Br = bp;
- tprintf("Digger: '%s' Banned for %d\n",
- argv[1],
- atoi(argv[2]) == 0 ? 1 : atoi(argv[2]));
- }
-
- return 0;
- }
-
- static int dgunban(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- register struct br *bp;
-
- if (argc < 2)
- tprintf("string missing!\n");
- else {
- for(bp = Br;bp != NULLLQ;bp = bp->next)
- if(strstr(argv[1],bp->addr))
- break;
-
- if(bp == NULLLQ) {
- tprintf("Not found\n");
- return 1;
- }
-
- if(bp->prev != NULLLQ)
- bp->prev->next = bp->next;
- else
- Br = bp->next;
- if(bp->next != NULLLQ)
- bp->next->prev = bp->prev;
-
- tprintf("Digger: '%s' unbanned\n",argv[1]);
- }
- return 0;
- }
-
- /** This is the function to handle the interface to the smtp server.
- ** It waits for a resume, then processes everything on the list. */
- static void DiggerProcess()
- {
- for (;;) {
- pwait(&DiggerLock); /* wait for something to do... */
- CheckForStuff(NULL,NULLCHAR,NULL); /* ...then do it */
- }
- }
-
- static int dgretr __ARGS((int argc,char *argv[],void *p));
- static int sendhelp __ARGS((int argc,char *argv[],void *p));
- static int sendindex __ARGS((int argc,char *argv[],void *p));
- static int listarchives __ARGS((int argc,char *argv[],void *p));
-
- static struct cmds diggercmds[] = {
- "archives", listarchives, 0, 0, NULLCHAR,
- "help", sendhelp, 0, 0, NULLCHAR,
- "index", sendindex, 0, 1, NULLCHAR,
- "retrieve", dgretr, 0, 1, NULLCHAR,
- NULLCHAR
- };
-
- /** This function is responsible for reading in mail sent to Digger
- ** and processing the commands. */
- static int CheckForStuff(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- register struct br *bp;
- char *CLine, filename[128], *cp;
- int result;
- FILE *fp;
-
- fflush(stdout);
- while (mlock(Mailspool,"Digger")) /* until we get the lock */
- pause(10 * 1000 / MSPTICK); /* wait 10 seconds */
- fflush(stdout);
- sprintf(filename,"%s/%s",Mailspool,"Digger.txt");
- fp = fopen(filename,"r");
- if (fp == NULL) {
- (void) rmlock(Mailspool,"Digger"); /* remove our hold on it */
- return 0;
- }
-
- strcpy(whoto, "Postmaster");
-
- reqcnt = 0;
- CLine = mallocw(BUFSIZ);
- while (fgets(CLine,BUFSIZ,fp) != NULLCHAR) {
- rip(CLine);
-
- if (strnicmp(CLine,"Reply-To: ",10) == 0) {
- strcpy(whoto, getaddress(CLine,0));
- } else if (strnicmp(CLine,"From: ",6) == 0) {
- strcpy(whoto, getaddress(CLine,0));
- }
-
- if (strnicmp(CLine,"R:",2) == 0) {
- tonic = strstr(strdup(CLine),"@");
- if((cp=strchr(tonic,' ')) != NULLCHAR)
- *cp = '\0';
- }
-
- for(bp = Br;bp != NULLLQ;bp = bp->next)
- if(strstr(whoto, bp->addr)) {
- mainlog(-1,"Digger rejected request from '%s'", whoto);
- goto rejlab;
- }
-
- if(strlen(CLine) > 0)
- if((result = cmdparse(diggercmds, CLine, p)) == 0);
- }
- rejlab:
- free(CLine);
- fclose(fp);
-
- unlink(filename);
- rmlock(Mailspool,"Digger"); /* remove our hold on it */
-
- return 0;
- }
-
- static int dgretr(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- FILE *in;
- char buf[100], command[100], error[100], *archive, *specific;
-
- specific = (argv[1] == NULLCHAR) ? NULL : argv[1];
- archive = (argv[2] == NULLCHAR) ? "DataBase" : argv[2];
-
- mainlog(-1,"Digger: Retrieve '%s' From '%s' For '%s'",
- specific, archive, whoto);
-
- sprintf(error,"%s/error", Digger);
- if(reqcnt < MaxReq)
- if(specific != NULL) {
- if(strstr(specific,"*") != NULL)
- mailcat(error,"Wild Cards Not Permitted!");
- else {
- sprintf(buf,"%s/%s", DiggerC, specific);
- if((in = fopen(buf,READ_TEXT)) != NULLFILE) {
- fclose(in);
- mailcat(buf,specific);
- } else {
- sprintf(command,"LHA >nil: -N -n -m x %s/%s %s/ %s",
- Digger, archive, DiggerC, specific);
- if (!Execute(command, 0, 0)) {
- return (FILE *)NULL;
- }
- if((in = fopen(buf,READ_TEXT)) != NULLFILE) {
- fclose(in);
- mailcat(buf,specific);
- reqcnt++;
- } else
- mailcat(error,"File Not Found!");
- }
- }
- } else {
- sprintf(buf,"%s/retrieve",Digger);
- mailcat(buf,"retrieve");
- reqcnt++;
- }
-
- return 0;
- }
-
- static int sendhelp(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- char buf[100];
-
- if(reqcnt < MaxReq) {
- mainlog(-1,"Digger: Help Requested By '%s'", whoto);
- sprintf(buf,"%s/help",Digger);
- mailcat(buf,argv[0]);
- reqcnt++;
- }
- return 0;
- }
-
- static int sendindex(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- char buf[100], command[100], error[100], *archive;
-
- archive = (argv[1] == NULLCHAR) ? "DataBase" : argv[1];
-
- if(reqcnt < MaxReq)
- if(strstr(archive,"*") == NULL) {
- mainlog(-1,"Digger: Index '%s' For '%s'", archive, whoto);
- sprintf(command, "LHA >%s/index -N l %s/%s", Digger, Digger, archive);
- if (!Execute(command, 0, 0)) {
- return (FILE *)NULL;
- }
- sprintf(buf,"%s/index", Digger);
- mailcat(buf,archive);
- reqcnt++;
- } else {
- sprintf(error,"%s/error", Digger);
- mailcat(error,"Wild Cards Not Permitted!");
- }
-
- return 0;
- }
-
- static int listarchives(argc,argv,p)
- int argc;
- char *argv[];
- void *p;
- {
- char buf[100];
-
- if(reqcnt < MaxReq) {
- mainlog(-1,"Digger: Archives Requested By '%s'", whoto);
- sprintf(buf,"%s/archives",Digger);
- mailcat(buf,argv[0]);
- reqcnt++;
- }
-
- return 0;
- }
-
- /* Given the person to mail it to, and a file name, this opens the file
- and mails the contents to the specified user. */
- static int mailcat(file,explanation)
- char *file, *explanation;
- {
- FILE *in, *out;
- char fn[50], subject[50];
- int data, bcount=0, partno = 1;
-
- in = fopen(file,"r");
-
- while ((data = fgetc(in)) != EOF) {
- out = fopen("t:smtptemp.fil","w+");
- if (in == NULL || out == NULL) return -1;
- sprintf(subject,"%s - %d",explanation,partno);
- AddSMTPHeader(out,subject);
- if((bcount%MaxSeg == 0) && (bcount != 0))
- fprintf(out,"[Continued from Part %d]\n\n",partno - 1);
- fputc(data,out);
- bcount++;
- while (((data = fgetc(in)) != EOF) && (bcount%MaxSeg != 0)) {
- fputc(data,out);
- bcount++;
- }
- if(bcount%MaxSeg == 0) {
- fputc(data,out);
- partno++;
- fprintf(out,"\n\n[Continued in Part %d]\n",partno);
- }
- rewind(out);
-
- sprintf(fn,"Digger@%s",Hostname);
- mailuser(out,fn,whoto);
-
- fclose(out);
- unlink("t:smtptemp.fil");
- }
- fclose(in);
-
- return 0;
- }
-
- /* Given an open file pointer, this tacks on the proper SMTP header. */
- static int AddSMTPHeader(tfile,explanation)
- FILE *tfile;
- char *explanation;
- {
- time_t t;
- char buf[AXALEN], *mynic, *cp, *cp2, newto[80];
- int32 id;
-
- if (tfile != NULLFILE) {
-
- pax25(buf,Mycall);
- if((cp=strchr(buf,'-')) != NULLCHAR)
- *cp = '\0';
-
- if (RHdr != NULLCHAR) {
- mynic = strdup(RHdr);
- if((cp2=strchr(mynic,' ')) != NULLCHAR)
- *cp2 = '\0';
- }
-
- time(&t);
- id = get_msgid();
-
- fprintf(tfile,"%s%s",Hdrs[DATE],ptime(&t));
- fprintf(tfile,"%s<%ld@%s>\n",Hdrs[MSGID], id, Hostname);
-
- fprintf(tfile,"%s%s@%s (%s)\n", Hdrs[FROM],
- strlen(buf) ? buf : "Digger",
- strlen(buf) ? (strlen(mynic) ? mynic : Hostname) : Hostname,
- strlen(buf) ? "Digger" : "File Server");
-
- if (Organ != NULLCHAR)
- fprintf(tfile,"%s%s\n",Hdrs[ORGANISATION],Organ);
-
- if(strstr(whoto,".bbs")) {
- if((cp2=strchr(whoto,'%')) != NULLCHAR)
- *cp2 = '\0';
- if((cp2=strchr(tonic,':')) != NULLCHAR)
- cp2 = &tonic[2];
- else
- cp2 = &tonic[1];
- sprintf(newto, "%s@%s", whoto, cp2);
- fprintf(tfile,"To: %s\n",newto);
- } else
- fprintf(tfile,"To: %s\n",whoto);
-
- fprintf(tfile,"%sRe: '%s'\n", Hdrs[SUBJECT], explanation);
- fprintf(tfile,"%sAmigaNOS v%s\n",Hdrs[COMMENT],Version);
- fprintf(tfile,"\n");
- if (RHdr != NULLCHAR)
- fprintf(tfile,"R:%s @:%s #:%ld\n\n",
- mbxtime(ptime(&t)), RHdr, id);
- } else return -1;
- }
-